#include <logbase.h>
#include <genrand.h>
#include <pthread.h>
#include <threadExcuter.h>
// 提前介绍linux的pthread多线程。因为数据结构在多线程需要锁。在clearn.v2.002.07也有用到。
// 被锁住的过程，不要return等退出。否则会死锁。
// 锁过程要短。
// 尽量不要锁内还有锁。
// locka lockb unlocka unlockb可能死锁。
// locka lockb unlockb unlocka到没问题。
static int globalValue = 0;

#define USE_LOCK_FOR_CHANGE_VALUE 1
#define MUTEX_CHECK_COUNT 1000

void *functionThread(void *vp)
{
    struct thrdExeStct *thrdInform = vp;
    while (globalValue < MUTEX_CHECK_COUNT)
    {
#if USE_LOCK_FOR_CHANGE_VALUE
        thrdExeLock(thrdInform);
#endif
        logdebugc("%s, value=%d", __func__, globalValue++);
#if USE_LOCK_FOR_CHANGE_VALUE
        thrdExeUnlock(thrdInform); // 解锁
#endif
    }
    return NULL;
}

int main(int argc, char **argv)
{
    struct thrdExeStct checkthread;
    thrdExeInit(&checkthread, functionThread, NULL);
    thrdExeBegin(&checkthread);
    while (globalValue < MUTEX_CHECK_COUNT)
    {
#if USE_LOCK_FOR_CHANGE_VALUE
        thrdExeLock(&checkthread);
#endif
        logdebugc("%s, value=%d", __func__, globalValue++);
#if USE_LOCK_FOR_CHANGE_VALUE
        thrdExeUnlock(&checkthread); // 解锁
#endif
    }
    thrdExeQuit(&checkthread);
    return 1;
}

// 不用锁就会有2线程数据不一致情况。用valotile没有用的。
// [2023-12-13 15:52:03.269][dbg][cthread.c,18]functionThread, value=897
// [2023-12-13 15:52:03.298][dbg][cthread.c,18]functionThread, value=898
// [2023-12-13 15:52:03.870][dbg][cthread.c,36]main, value=111
// [2023-12-13 15:52:03.337][dbg][cthread.c,36]main, value=899
// [2023-12-13 15:52:03.348][dbg][cthread.c,36]main, value=900
